package org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas;

import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.Partido;
import org.javahispano.javacup.modelo.Tactica;

public class TacticEvaluator {

	public final static int NUM_MATCHES = 15;

	/**
	 * Permite ejecutar cruzar varias veces dos TacticaTierAI configuradas por
	 * los parametros. Se devuelve (puntos locales - puntos visitante). Si se
	 * gana cada gol hace acumular 2 puntos, si se pierde solo se acumula 1
	 * punto. Se juegan NUM_MATCHES para comprobar quien consigue mas puntos.
	 * 
	 * @param localConfiguration
	 *            configuracion para la tactica local que jugara varios partidos
	 *            con la tactica visitante
	 * @param foreignConfiguration
	 *            configuracion para la tactica visitante que jugara varios
	 *            partidos con la tactica local
	 * */
	public static int evaluate(SoccerMatchConfiguration localConfiguration,
			SoccerMatchConfiguration foreignConfiguration, int numMatches) {
		Partido p = null;
		int pointsLocal = 0, pointsForeign = 0;

		try {
			for (int count = 0; count < numMatches; count++) {
				p = new Partido(new TacticaTierAI(localConfiguration),
						new TacticaTierAI(foreignConfiguration), false);

				p.inicioRapido();
				p.iterar();

				for (int i = 0; i < Constantes.ITERACIONES; i++) {
					p.iterar();
				}

				// final de un partido, acumulamos los puntos
				if (p.getGolesLocal() == p.getGolesVisita()) {
					pointsLocal += p.getGolesLocal();
					pointsForeign += p.getGolesVisita();
				} else if (p.getGolesLocal() > p.getGolesVisita()) {
					pointsLocal += p.getGolesLocal() * 2;
					pointsForeign += p.getGolesVisita();
				} else if (p.getGolesLocal() < p.getGolesVisita()) {
					pointsLocal += p.getGolesLocal();
					pointsForeign += p.getGolesVisita() * 2;
				}

			}

		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}

		return pointsLocal - pointsForeign;
	}

	public static int evaluate(SoccerMatchConfiguration localConfiguration,
			Tactica foreignTactic, int numMatches) {
		Partido p = null;
		int pointsLocal = 0, pointsForeign = 0;

		try {
			for (int count = 0; count < numMatches; count++) {
				p = new Partido(new TacticaTierAI(localConfiguration),
						foreignTactic, false);

				p.inicioRapido();
				p.iterar();

				for (int i = 0; i < Constantes.ITERACIONES; i++) {
					p.iterar();
				}

				// final de un partido, acumulamos los puntos
				if (p.getGolesLocal() == p.getGolesVisita()) {
					pointsLocal += p.getGolesLocal();
					pointsForeign += p.getGolesVisita();
				} else if (p.getGolesLocal() > p.getGolesVisita()) {
					pointsLocal += p.getGolesLocal() * 2;
					pointsForeign += p.getGolesVisita();
				} else if (p.getGolesLocal() < p.getGolesVisita()) {
					pointsLocal += p.getGolesLocal();
					pointsForeign += p.getGolesVisita() * 2;
				}

			}

		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}

		return pointsLocal - pointsForeign;
	}

	public static void main(String[] args) throws Exception {
		SoccerMatchConfiguration localConfiguration = new SoccerMatchConfiguration();
		SoccerMatchConfiguration visitanteConfiguration = new SoccerMatchConfiguration();

		// mejor resultado con EvaluadorConvinatorio
		localConfiguration.setIndexAlineacion(6);
		localConfiguration.setIndexDetalle(4);

		// mejor resultado con EvaluadorGenetico
		visitanteConfiguration.setIndexDetalle(2);
		visitanteConfiguration.setIndexAlineacion(4);
		visitanteConfiguration.setKickElevation(12.373665f);
		visitanteConfiguration.setAutoPassDegradationWeight(0.9056444f);
		visitanteConfiguration.setOpponentMinDistance(8.324492f);
		visitanteConfiguration.setDefenderMinDistance(2.2960243f);
		visitanteConfiguration.setVerticalSlice(10);
		visitanteConfiguration.setHorizontalSlice(11);
		visitanteConfiguration.setMinPassDistance(8.563067f);
		visitanteConfiguration.setMaxPassDistance(60.047764f);
		visitanteConfiguration.setPassDegradationWeight(0.52958155f);
		visitanteConfiguration.setDefenderMinDistanceInPass(4.4689364f);
		visitanteConfiguration.setNumDefenders(3);
		visitanteConfiguration.setNumSupporters(4);
		visitanteConfiguration.setDistanceForAttack(6.636519f);
		visitanteConfiguration.setDistanceForDefense(12.351073f);
		visitanteConfiguration.setAutoPassForce(0.18549725f);
		visitanteConfiguration.setPassForce(0.9540824f);
		visitanteConfiguration.setStepsWaitingForBall(2);
		visitanteConfiguration.setStabilizationFactorForStrike(0.45979154f);
		visitanteConfiguration.setStabilizationFactorForPass(0.024239661f);

		int res = TacticEvaluator.evaluate(localConfiguration,
				visitanteConfiguration, NUM_MATCHES);

		if (res == 0)
			System.out.print("las dos tacticas han empatado");
		else if (res > 0)
			System.out.print("la tactica local ha ganado por " + res
					+ " puntos de diferencia");
		else if (res < 0)
			System.out.print("la tactica visitante ha ganado por " + -res
					+ " puntos de diferencia");

	}
}
